package cn.tedu.charging.device.service.impl;

import cn.tedu.charging.common.pojo.query.NearStationsQuery;
import cn.tedu.charging.common.pojo.vo.GunInfoVO;
import cn.tedu.charging.common.pojo.vo.StationDetailVO;
import cn.tedu.charging.common.pojo.vo.StationInfoVO;
import cn.tedu.charging.device.dao.repository.DeviceRepository;
import cn.tedu.charging.device.pojo.po.ChargingGunInfoPO;
import cn.tedu.charging.device.pojo.po.ChargingStationPO;
import cn.tedu.charging.device.pojo.po.StationGeoPO;
import cn.tedu.charging.device.service.DeviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class DeviceServiceImpl implements DeviceService {
    @Autowired
    private DeviceRepository deviceRepository;
    @Override
    public List<StationInfoVO> nearStations(NearStationsQuery query) {
        //初始化一个返回变量 如果正常封装 赋值返回 没数据返回空
        List<StationInfoVO> vos=null;
        //1.读取仓储层数据集合 我们目前知道数据组成单独使用redis查不完
        List<StationGeoPO> pos=deviceRepository.nearStations(query);
        //判断非空
        if(pos!=null&&pos.size()>0){
            //2.组装vos集合中的每一个vo对象
            //2.1vos先初始化
            vos=new ArrayList<>();
            //2.2遍历pos集合 每一个po对象都要封装成一个vo对象
            for(StationGeoPO po:pos){
                StationInfoVO vo=new StationInfoVO();
                vo.setStationId(po.getStationId());
                vo.setStationLat(po.getStationLat());
                vo.setStationLng(po.getStationLng());
                vo.setStationName(po.getStationName());
                //2.3数据层返回的距离 单位是米 所以需要调整 缩小1000倍,同时只取两位的小数点
                vo.setDistance(calculateDistance(po.getDistance()));
                vo.setStationStatus(po.getStationStatus());
                //2.4平均电价 轻做写死1.5元
                vo.setAvgPrice(1.5);
                vos.add(vo);
            }
        }
        //TODO 能否对当前集合list 做一个按距离升序的排序呢stream().sorted()
        return vos;
    }

    private BigDecimal calculateDistance(BigDecimal distance) {
        //890076米 转化成千米 取2位小数点 890076/1000 做四舍五入 890.08
        return distance.divide(new BigDecimal(1000)).setScale(2,BigDecimal.ROUND_HALF_UP);
    }

    @Override
    public StationDetailVO detailStation(Integer stationId) {
        log.debug("查询充电站详情,参数:{}",stationId);
        //准备一个空的vo对象
        StationDetailVO vo=null;
        //1.直接调用仓储层查询po
        ChargingStationPO stationPO=deviceRepository.getStationById(stationId);
        //判断station是否非空
        if (stationPO!=null){
            log.debug("查询充电站详情成功,结果:{}",stationPO);
            //初始化返回值
            vo=new StationDetailVO();
            //2.利用场站id 查询一下该场站下关联的所有的枪
            List<ChargingGunInfoPO> gunPos = deviceRepository.getStationGuns(stationId);
            List<GunInfoVO> gunVos=null;
            //判断枪pos是否非空
            if (gunPos!=null&&gunPos.size()>0){
                log.debug("该充电站,存在充电枪数据,结果:{}",gunPos);
                //3.初始化gunVos并且循环遍历gunPos封装vo元素
                gunVos=new ArrayList<>();
                for (ChargingGunInfoPO gunPo : gunPos) {
                    //直接将gunPo做beanUtils拷贝
                    GunInfoVO gunVo=new GunInfoVO();
                    BeanUtils.copyProperties(gunPo,gunVo);
                    gunVos.add(gunVo);
                }
            }
            //4.把StationDetailVO所需的数据,从上述对象中获取set
            vo.setStationId(stationId);
            vo.setStationStatus(stationPO.getStationStatus());
            vo.setStationName(stationPO.getStationName());
            vo.setAddress(stationPO.getAddress());
            //枪列表
            vo.setGunInfoVos(gunVos);
        }
        return vo;
    }

    @Override
    public void updateGunStatus(Integer gunId, Integer status) {

    }

    @Override
    public Boolean checkGunAvailable(Integer gunId) {
        return null;
    }
}
